所謂的範圍鍊是指當函式本身沒有變數時,而向外層尋找變數的過程,
但尋找的過程和執行環境沒有任何關係,而是跟作用域有關係
範例:
var person = 'mother';
function sayHi() {
console.log(`hi ${person}`);
}
sayHi();
該範例會顯示 'hi mother',
因為 sayHi() 函式內沒有 perosn 這個變數,
sayHi的範圍鍊會指向全域,
所以會將全域的 person 的值代入函式中,
因此才會回傳 'hi mother'
圖解
再看一個範例
let person = 'mother';
function sayHi() {
console.log(`hi ${person}`);
}
function doMorningWork() {
let person = 'father';
function meetAuntie() {
let person = 'weiwei';
console.log(`hello ${person}`);
}
sayHi();
meetAuntie();
}
doMorningWork();
該範例會回傳兩個值分別為 'hi mother' 和 'hello weiwei',
首先 doMorningWork() 的 sayHi() 裡的 person 會指向全域,
而 meetAuntie() 因為函式內已經有宣告 person 變數,
所以會使用自己函式內部的變數
圖解

最後一個範例,將 meetAuntie() 內宣告的變數拿掉
let person = 'mother';
function doMorningWork() {
let person = 'father';
function meetAuntie() {
console.log(`hello ${person}`);
}
meetAuntie();
}
doMorningWork();
此時結果為 'hello father',
在 meetAuntie() 的範圍鍊會指向 doMorningWork(),
因為 meetAuntie() 沒有 person 變數,
因此會向外層尋找,而此時的 meetAuntie() 外層為 doMorningWork(),
所以 person 的值會是 'father'
圖解
此時如果將 doMorningWork() 宣告的 person 拿掉的話
let person = 'mother';
function doMorningWork() {
function meetAuntie() {
console.log(`hello ${person}`);
}
meetAuntie();
}
doMorningWork();
此時 meetAuntie() 的範圍鍊就會指向全域,
因此回傳結果為 'hello mother'

以上就是範圍鍊的內容,明天說明提升(hoisting)